package 异常的处理.异常的捕获.finallY;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-21
 * Time: 19:15
 */
//问题：既然 finally 和 try-catch-finally 后的代码都会执行，那为什么还要有finally呢？

//需求：实现getData方法，内部输入一个整型数字，然后将该数字返回，并将main方法打印
public class TestFinally {
    public static int getData() {
        Scanner scanner = null;
        try {
            scanner = new Scanner(System.in);
            int data = scanner.nextInt();
            return data;
        } catch (InputMismatchException e) {
            e.printStackTrace();
        } finally {
            System.out.println("finally中的代码");
        }

        System.out.println("try-catch-finally之后的代码");
        if(scanner != null) {
            scanner.close();
        }

        return 0;
    }

    public static void main1(String[] args) {
        int data = getData();
        System.out.println(data);
    }

    public static int func() {
        try {
            return 10;
        } finally {
            return 20;
        }
    }
    public static void main(String[] args) {
        System.out.println(func());
    }
    //A: 10 B: 20 C: 30 D: 编译失败
}

/*
执行结果：
100
finally中的代码
100
 */

/*
上述代码，如果正常输入，成功接收输入后程序就返回了，try-catch-finally之后的代码根本就没有执行，即输入流就没有被释放，造成资源泄漏。

注意：finally中的代码一定会执行的，一般在finally中进行一些资源清理的扫尾工作。
 */

/*
finally 执行的时机是在方法返回之前(try 或者 catch 中如果有 return 会在这个 return 之前执行 finally). 但是如果
finally 中也存在 return 语句, 那么就会执行 finally 中的 return, 从而不会执行到 try 中原有的 return.

一般我们不建议在 finally 中写 return (被编译器当做一个警告)

【面试题】
1. throw 和 throws 的区别？
2. finally中的语句一定会执行吗？
 */
